package MyThread;

import sun.reflect.generics.tree.Tree;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: AliceMana
 * Date: 2022-12-30
 * Time: 15:56
 */

// 通过Thread自带的标志位, 来进行判定
public class ThreadDemo9 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            // Thread.currentThread() 是Thread类的静态方法, 通过这个方法可以获取到当前线程
            // 哪个线程调用这个方法, 就是得到哪个线程的对象引用.. 类似于 this
            // 现在这个方法是在t.run中被调用的, 此处获取的就是 t 线程对象的引用
            // isInterrupted 为true表示被终止, 为false表示未被终止(应该继续走).
            while (!Thread.currentThread().isInterrupted()) {
                System.out.println("hello thread");

                // 这里, 线程t 忽略了终止的请求
//                try {
//                    Thread.sleep(1000);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }

                // 这里, 线程t 主动响应了终止的请求(加上break)
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    // 稍后进行终止
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                    break;
                }
            }
        });
        t.start();
        Thread.sleep(3000);

        /**
         * 这里interrupted 做了两件事,
         * 1. 把线程内部的标志位(boolean)设置成 true
         * 2. 如果线程在进行sleep, 会触发异常, 唤醒sleep
         * 但是, 唤醒sleep之后, 还会做一件事, 就是把标志位重新改为false
         *
         * 终止, 只是通知终止, 并不一定终止
         */
        // 可以终止线程
        t.interrupt();
    }
}
